package com.clear.factory.factoryMethod;


import com.clear.factory.factoryMethod.resourceFactory.IResourceLoader;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 加载资源
 */
public class ResourceLoader {

    private IResourceLoader resourceLoader;

    public void setResourceLoader(IResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    // todo 版本二
//    private static Map<String, IResourceLoader> resourceLoaderCache = new HashMap<>(8);

//    static {
//        resourceLoaderCache.put("http", new HttpResourceLoader());
//        resourceLoaderCache.put("file", new FileResourceLoader());
//        resourceLoaderCache.put("classpath", new ClassPathResourceLoader());
//        resourceLoaderCache.put("Default", new DefaultResourceLoader());
//
//    }

    // todo 版本三 终极版本 加载配置文件到缓存
    //  1.完全满足开闭原则，当需要扩充需求时，只需要新增实现和修改配置文件，不需要修改一行代码
    private static Map<String, IResourceLoader> resourceLoaderCache = new HashMap<>(8);

    static {
        Properties properties;
        try (InputStream is = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("resourceLoader.properties")) {
            properties = new Properties();
            properties.load(is);
            for (Map.Entry<Object, Object> entry : properties.entrySet()) {
                // 拿到key
                String key = entry.getKey().toString();
                // 拿到value
                Class<?> clazz = Class.forName(entry.getValue().toString());
                IResourceLoader resource = (IResourceLoader) clazz.getConstructor().newInstance();

                resourceLoaderCache.put(key, resource);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @param url file://   http://    ftp://
     * @return 资源类
     */
    public Resource load(String url) {
        // 1.根据url获取前缀
        String prefix = getPrefix(url);

        // 2.根据前缀的不同，选择不同的工厂，生产独自的产品
        // todo 版本一
//        if ("http".equals(prefix)) {
//            resourceLoader = new HttpResourceLoader();
//        } else if ("file".equals(prefix)) {
//            resourceLoader = new FileResourceLoader();
//        } else if ("classpath".equals(prefix)) {
//            resourceLoader = new ClassPathResourceLoader();
//        } else {
//            resourceLoader = new DefaultResourceLoader();
//        }
//
//        return resourceLoader.load(url);

        // todo 版本二 版本三
        return resourceLoaderCache.get(prefix).load(url);
    }

    private String getPrefix(String url) {
        if (url == null || "".equals(url) || !url.contains(":")) {
            throw new ResourceLoadException("传入的资源url不合法");
        }
        String[] split = url.split(":");
        return split[0];
    }
}
